home *** CD-ROM | disk | FTP | other *** search
/ Risc World 5 / Risc World 5.iso / SOFTWARE / Issue5 / PD / DIRSYNC / LegalStuff / ccres / c / _Menu < prev    next >
Text File  |  2004-03-20  |  6KB  |  114 lines

  1. /* _Menu.c
  2.    $Id: _Menu.c,v 1.2 2004/03/20 22:13:33 joty Exp $
  3.  
  4.    Copyright (c) 2003-2004 Dave Appleby / John Tytgat
  5.  
  6.    This file is part of CCres.
  7.  
  8.    CCres is free software; you can redistribute it and/or modify
  9.    it under the terms of the GNU General Public License as published by
  10.    the Free Software Foundation; either version 2 of the License, or
  11.    (at your option) any later version.
  12.  
  13.    CCres is distributed in the hope that it will be useful,
  14.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.    GNU General Public License for more details.
  17.  
  18.    You should have received a copy of the GNU General Public License
  19.    along with CCres; if not, write to the Free Software
  20.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  21.  */
  22.  
  23. #include "ccres.h"
  24.  
  25. #include <stdio.h>
  26.  
  27. #include <OSLib/menu.h>
  28.  
  29.  
  30. static FLAGS MenuFlags[] = {
  31.     {menu_GENERATE_ABOUT_TO_BE_SHOWN , "menu_GENERATE_ABOUT_TO_BE_SHOWN" },
  32.     {menu_GENERATE_DIALOGUE_COMPLETED, "menu_GENERATE_DIALOGUE_COMPLETED"}
  33. };
  34.  
  35. static OBJECTLIST MenuObjectList[] = {
  36.     {iol_FLAGS, "menu_flags:",  offsetof(menu_object, flags),       MenuFlags,       ELEMENTS(MenuFlags)               },
  37.     {iol_MSG,   "title:",       offsetof(menu_object, title),       "title_limit:",  offsetof(menu_object, title_limit)},
  38.     {iol_MSG,   "help:",        offsetof(menu_object, help),        "help_limit:",   offsetof(menu_object, help_limit) },
  39.     {iol_BITS,  "show_action:", offsetof(menu_object, show_action), NULL,            bits_ACTION                       },
  40.     {iol_BITS,  "hide_action:", offsetof(menu_object, hide_action), NULL,            bits_ACTION                       }
  41. };
  42.  
  43. static FLAGS MenuEntryFlags[] = {
  44.     {menu_ENTRY_TICKED                  , "menu_ENTRY_TICKED"                  },
  45.     {menu_ENTRY_SEPARATE                , "menu_ENTRY_SEPARATE"                },
  46.     {menu_ENTRY_FADED                   , "menu_ENTRY_FADED"                   },
  47.     {menu_ENTRY_IS_SPRITE               , "menu_ENTRY_IS_SPRITE"               },
  48.     {menu_ENTRY_SUB_MENU                , "menu_ENTRY_SUB_MENU"                },
  49.     {menu_ENTRY_GENERATE_SUB_MENU_ACTION, "menu_ENTRY_GENERATE_SUB_MENU_ACTION"},
  50.     {menu_ENTRY_IS_MENU                 , "menu_ENTRY_IS_MENU"                 }
  51. };
  52.  
  53. // MenuEntry must be split into two to cope with the text entry, which is STRING for text and MSG for sprites-
  54. // So when converting text to res, we read the flags, set iol_STRING or iol_MSG as appropriate, then do the rest...
  55. static OBJECTLIST MenuEntryObjectListFlags[] = {
  56.     {iol_FLAGS, "flags:",                offsetof(menu_entry_object, flags),                MenuEntryFlags, ELEMENTS(MenuEntryFlags)               },
  57.     {iol_BITS,  "cmp:",                  offsetof(menu_entry_object, cmp),                  NULL,           bits_EVAL                              }
  58. };
  59. static OBJECTLIST MenuEntryObjectList[] = {
  60.     {iol_MSG,   "text:",                 offsetof(menu_entry_object, text),                 "text_limit:",  offsetof(menu_entry_object, text_limit)},
  61.     {iol_STRING,"click_object_name:",    offsetof(menu_entry_object, click_object_name),    NULL,           0                                      },
  62.     {iol_STRING,"sub_menu_object_name:", offsetof(menu_entry_object, sub_menu_object_name), NULL,           0                                      },
  63.     {iol_BITS,  "sub_menu_action:",      offsetof(menu_entry_object, sub_menu_action),      NULL,           bits_ACTION                            },
  64.     {iol_BITS,  "click_action:",         offsetof(menu_entry_object, click_action),         NULL,           bits_ACTION                            },
  65.     {iol_MSG,   "help:",                 offsetof(menu_entry_object, help),                 "help_limit:",  offsetof(menu_entry_object, help_limit)}
  66. };
  67.  
  68.  
  69. int _menu(PDATA data, PSTR pszIn, toolbox_relocatable_object_base * object)
  70. {
  71.     menu_object_base * menu;
  72.     menu_entry_object * entry;
  73.     PSTR pszEnd;
  74.     int entry_count;
  75.  
  76.     menu = (menu_object_base *) (object + 1);
  77.     put_objects(data, pszIn, 0, (PSTR) menu, MenuObjectList, ELEMENTS(MenuObjectList));
  78.  
  79.     pszEnd = data->pszIn + data->cbIn;
  80.     entry = (menu_entry_object *) (menu + 1);
  81.     entry_count = 0;
  82.     while (next_object(&pszIn, pszEnd) != NULL) {
  83.         put_objects(data, pszIn, (int) ((PSTR) entry - (PSTR) menu), (PSTR) entry, MenuEntryObjectListFlags, ELEMENTS(MenuEntryObjectListFlags));
  84.         MenuEntryObjectList[0].nTable = (entry->flags & menu_ENTRY_IS_SPRITE) ? iol_STRING : iol_MSG;        // text or sprite?
  85.         put_objects(data, pszIn, (int) ((PSTR) entry - (PSTR) menu), (PSTR) entry, MenuEntryObjectList, ELEMENTS(MenuEntryObjectList));
  86.         entry++;
  87.         entry_count++;
  88.         if ((pszIn = object_end(data, pszIn, pszEnd)) == NULL) {
  89.             break;
  90.         }
  91.     }
  92.     menu->entry_count = entry_count;
  93.     return((int) ((PSTR) entry - (PSTR) menu));
  94. }
  95.  
  96.  
  97. void menu(FILE * hf, toolbox_resource_file_object_base * object, PSTR pszStringTable, PSTR pszMessageTable)
  98. {
  99.     menu_object_base * menu;
  100.     menu_entry_object * entry;
  101.     int n;
  102.  
  103.     menu = (menu_object_base *) (object + 1);
  104.     get_objects(hf, pszStringTable, pszMessageTable, (PSTR) menu, MenuObjectList, ELEMENTS(MenuObjectList), 1);
  105.  
  106.     for (n = 0, entry = (menu_entry_object *) (menu + 1); n < menu->entry_count; n++, entry++) {
  107.         fprintf(hf, "  Entry {\n    cmp:%d\n", (int) entry->cmp);
  108.         MenuEntryObjectList[0].nTable = (entry->flags & menu_ENTRY_IS_SPRITE) ? iol_STRING : iol_MSG;        // text or sprite?
  109.         get_objects(hf, pszStringTable, pszMessageTable, (PSTR) entry, MenuEntryObjectListFlags, ELEMENTS(MenuEntryObjectListFlags), 2);
  110.         get_objects(hf, pszStringTable, pszMessageTable, (PSTR) entry, MenuEntryObjectList, ELEMENTS(MenuEntryObjectList), 2);
  111.         fputs("  }\n", hf);
  112.     }
  113. }
  114.